#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e6+10;
LL n,a[MAXN],cnt,head[MAXN],f[MAXN][2],ans,st,ed,ban;
bool vis[MAXN];
struct edge
{
	LL v,next;
}e[MAXN*2];
void addedge(LL x,LL y)
{
	e[cnt]=(edge){y,head[x]};
	head[x]=cnt++;
	return;
}
void dfs(LL u,LL last)
{
	vis[u]=true;
	for(LL i=head[u];~i;i=e[i].next)
	{
		LL v=e[i].v;
		if(v==last)continue;
		if(vis[v])
		{
			st=u;
			ed=v;
			ban=i;
			continue;
		}
		dfs(v,u);
	}
	return;
}
void dp(LL u,LL last)
{
	f[u][1]=a[u];
	f[u][0]=0;
	for(LL i=head[u];~i;i=e[i].next)
	{
		if(i==ban||(i^1)==ban)continue;
		LL v=e[i].v;
		if(v==last)continue;
		dp(v,u);
		f[u][1]+=f[v][0];
		f[u][0]+=max(f[v][0],f[v][1]);
	}
	return;
}
int main()
{
	memset(head,-1,sizeof(head));
	scanf("%lld",&n);
	for(LL i=1;i<=n;++i)
	{
		LL x;
		scanf("%lld%lld",&a[i],&x);
		addedge(x,i);
		addedge(i,x);
	}
	for(LL i=1;i<=n;++i)
	{
		if(!vis[i])
		{
			dfs(i,0);
			dp(st,0);
			LL temp=f[st][0];
			dp(ed,0);
			temp=max(temp,f[ed][0]);
			ans+=temp;
		}
	}
	printf("%lld\n",ans);
	return 0;
}
